package cn.trigram.lang;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;

public class ReflectUtil {

  public static Class<?> getParameterTypeClass(Type t) {

    if (t instanceof WildcardType || t instanceof TypeVariable) {
      // 表示使用了泛型的不确定写法：<?>, <? extends Number>, <T>
      return null;
    } else if (t instanceof ParameterizedType) {
      Type[] types = ((ParameterizedType)t).getActualTypeArguments();
      if (types.length == 0) {
        return null;
      }
      Type type = types[0];
      if (type instanceof ParameterizedType) {
        /*集合的元素还是集合*/
        return (Class<?>)((ParameterizedType)type).getRawType();
      } else if (type instanceof Class) {
        /*集合的元素是确定值*/
        return (Class<?>)type;
      } else if (type instanceof TypeVariable) {
        //未定义，则返回null。则通过mapper接口，而不是方法来判断范型类型
        return null;
      } else {
        throw new UnsupportedOperationException(type.toString());
      }

    } else {
      throw new UnsupportedOperationException(t.toString());
    }

  }

}
